Lenguaje Python 3 Módulo 11

Se introduce en el módulo 11 a los conceptos de exploración de información, como parte de los análisis exploratorio en minería y ciencia de datos.

Datos

A pesar de estar trabajando con información en los diferentes módulos del curso es importante para un análsiis exploratorio y en caso de continuarse con análisis predictivos establecer criterios formales sobre los datos.

Una variable

Es una propiedad o característica de un fenómeno o un individuo: temperatura, estado civil, monto de ahorro, etc. El valor contenido en la variable es el dato. La secuencia de datos de esa variables corresponde a las observaciones y se pueden asociar a momentos (tiempo) o estados.

Una colección de variables describen en forma “suficiente” a un fenómeno o individuo: registro de DB, punto de medición, objeto, entidad, observación.

Variables cuantitativas

Es una variables que contiene números y pueden ser tratados de forma estadística y mediante análisis numéricos, por ejemplo series de tiempo de: niveles de embalses, temparaturas a lo largo del año, distancia, derivadas e integrales, etc.

Son variables numéricas y se representan con números enteros o en punto flotante, incluyendo números complejos.

Variables discretas

Son las variables numéricas que tiene valores puntuales y normalmente se representan con valores enteros.

Variables contínua.

Son las variables numéricas que tiene cualquier valor y normalmente se representan con valores en punto flotante (no existen reales en las computadoras), cuando la observación de tipo contínua se asocia a una “etampa de tiemp” (timestamp) se considera una variables histórica o series de tiempo y para ellas existen métodos de predicción por regresión.

Variable cualitativa

Es la variables que tiene como valor una descripción (enumerado) que categoriza la variable: Sexo femenino, masculino, el estado civil, un catálogo de carreras universitarias. Pueden ser valores numéricos que representan los estados de la variable pero no tiene sentido operaciones como: suma, resta, media. Se pueden cuantificar mediante su cuenta por tipo de estado y así sobre los valores obtenidos establecer inferencias estadísticas: porcentaje de casados y solteros por ejemplo a partir de contar cada categoría.

Se denominan variables categóricas y para efectos de ciencia y minería de datos deben ser explicitamente diferenciados de variables numéricas.

Las variables cualitativas son de tipo nominales y/o ordinales.

Variables Nominales

Permiten contar su valor, comparar entre catagorías, no se pueden hacer operaciones numéricas y hay que ajustarlas para poder hacer cálculos, ejemplo: número de teéfono, número cédula o pasaporte, código postal, etc.

Variables Ordinales

No son números (en primera instancia) ya que corresponden a categorías: nombre de región donde vive, sexo, estado civil, nombre del partido político de simpatía,

También corresponden a estados que no tienen orden, no tienen distancia o intervalo entre sus valores, se pueden contar para realizar operaciones, ejemplo: Grado académico (bachiller, master, doctor)

Estas varibles es necesario categorizarlas (establecer un código para cada estado) y para ello:

  1. Se ordenan bajo algún criterio,
  2. Se establecen valores de categoría (0 es hombre, 1 es mujer, San José=0, Alajuela=1),
  3. Se establecen los límites e intervalos de cada categoría.
  4. Se asigna una etiqueta a cada categoría.
  5. En cada posición de la variable original se cambia el valor según la etiqueta.

Manipulación de datos.

Para el análisis de información, sea exploratorio (análsiis sobre los datos) o preidictivo (metodología para predecir datos futuros a partir de los actuales), es importante realizar un análisis preliminar acompañado de ser necesario de transformaciones de datos: re-escalamientos, categorización de variables, normalización, descomposición de datos (obtener el mes del año de una variable timestamp),etc.

Con esta fase cubierta se procede a realizar análisis más profundos sobre los datos: estadísticas, clasificaciones, descomposiciones en tiempo o frecuencia, transformaciones lineales, etc.

Estudio de un data_frame

Para hacer el análisis una revisión de la metodología, se utilizará una muestra retrospectiva de hombres en una región de alto riesgo de enfermedad cardíaca en Western Cape, Sudáfrica. Hay aproximadamente dos controles por caso de enfermedad coronaria. Muchos de los hombres con enfermedad coronaria positiva se han sometido a un tratamiento de reducción de la presión arterial y otros programas para reducir sus factores de riesgo después de su evento de enfermedad coronaria. En algunos casos, las mediciones se realizaron después de estos tratamientos. Estos datos se toman de un conjunto de datos más grande, descrito en Rousseauw et al, 1983, South African Medical Journal.

Los detalles de la información son los siguientes:

  1. sbp: presión arterial sistólica

  2. tabaco: tabaco acumulativo (kg)

  3. ldl: colesterol unido a lipoproteínas de baja densidad

  4. adiposity: adiposidad

  5. famhist: antecedentes familiares de enfermedad cardíaca (presente, ausente)

  6. typea: comportamiento tipo A

  7. obesidad: nivel de obesidad.

  8. alcohol: consumo actual de alcohol

  9. edad: edad de inicio

  10. chd: tienen enfermedad coronaria (Si/No)

Se observa que chd y famhsit son definitivamente variables categóticas, las otras son numéricas.

Cargando archivo de referencia.

# Análisis Exploratorios Básico
# =============================

# Paso 1: Cargar la tabla de Datos
# Paquetes
import os
import pandas as pd
import numpy as np
import scipy.stats

import matplotlib.pyplot as plt

datos = pd.read_csv('../Datos/SAheart.csv',delimiter=';',decimal=".")
print(datos.head())
##    sbp  tobacco   ldl  adiposity  famhist  typea  obesity  alcohol  age chd
## 0  160    12.00  5.73      23.11  Present     49    25.30    97.20   52  Si
## 1  144     0.01  4.41      28.61   Absent     55    28.87     2.06   63  Si
## 2  118     0.08  3.48      32.28  Present     52    29.14     3.81   46  No
## 3  170     7.50  6.41      38.03  Present     51    31.99    24.26   58  Si
## 4  134    13.60  3.50      27.78  Present     60    25.99    57.34   49  Si
print(datos.shape)
## (462, 10)
print(datos.columns)
## Index(['sbp', 'tobacco', 'ldl', 'adiposity', 'famhist', 'typea', 'obesity',
##        'alcohol', 'age', 'chd'],
##       dtype='object')

Obteniendo datos estadísticos

En el siguiente código se presentan datos estadísrticos a partir de la tabla pandas entre estas: la media, la mediana, desviación estándar, maximo y quartiles. Tambié se aplican operaciones sobre datos NO NUMERICOS

# Paso 2: presentación de estadísticas básicas
print(datos.dropna().describe()) 
##               sbp     tobacco         ldl  ...     obesity     alcohol         age
## count  462.000000  462.000000  462.000000  ...  462.000000  462.000000  462.000000
## mean   138.326840    3.635649    4.740325  ...   26.044113   17.044394   42.816017
## std     20.496317    4.593024    2.070909  ...    4.213680   24.481059   14.608956
## min    101.000000    0.000000    0.980000  ...   14.700000    0.000000   15.000000
## 25%    124.000000    0.052500    3.282500  ...   22.985000    0.510000   31.000000
## 50%    134.000000    2.000000    4.340000  ...   25.805000    7.510000   45.000000
## 75%    148.000000    5.500000    5.790000  ...   28.497500   23.892500   55.000000
## max    218.000000   31.200000   15.330000  ...   46.580000  147.190000   64.000000
## 
## [8 rows x 8 columns]
print(datos.mean(numeric_only=True))
## sbp          138.326840
## tobacco        3.635649
## ldl            4.740325
## adiposity     25.406732
## typea         53.103896
## obesity       26.044113
## alcohol       17.044394
## age           42.816017
## dtype: float64
print(datos.median(numeric_only=True))
## sbp          134.000
## tobacco        2.000
## ldl            4.340
## adiposity     26.115
## typea         53.000
## obesity       25.805
## alcohol        7.510
## age           45.000
## dtype: float64
print(datos.std(numeric_only=True))
## sbp          20.496317
## tobacco       4.593024
## ldl           2.070909
## adiposity     7.780699
## typea         9.817534
## obesity       4.213680
## alcohol      24.481059
## age          14.608956
## dtype: float64
print(datos.max(numeric_only=True))
# Los percentiles
## sbp          218.00
## tobacco       31.20
## ldl           15.33
## adiposity     42.49
## typea         78.00
## obesity       46.58
## alcohol      147.19
## age           64.00
## dtype: float64
print(datos.quantile(np.array([0,.25,.50,.75,1])))
##         sbp  tobacco      ldl  adiposity  typea  obesity   alcohol   age
## 0.00  101.0   0.0000   0.9800     6.7400   13.0  14.7000    0.0000  15.0
## 0.25  124.0   0.0525   3.2825    19.7750   47.0  22.9850    0.5100  31.0
## 0.50  134.0   2.0000   4.3400    26.1150   53.0  25.8050    7.5100  45.0
## 0.75  148.0   5.5000   5.7900    31.2275   60.0  28.4975   23.8925  55.0
## 1.00  218.0  31.2000  15.3300    42.4900   78.0  46.5800  147.1900  64.0

Tabla cruzada

# Tabla cruzada

# En las variables no numéricas
# Contando
print(pd.crosstab(index=datos["chd"],columns="count"))
## col_0  count
## chd         
## No       302
## Si       160
print(pd.crosstab(index=datos["famhist"],columns="count"))
# Otra forma
## col_0    count
## famhist       
## Absent     270
## Present    192
print(datos['chd'].value_counts())
## No    302
## Si    160
## Name: chd, dtype: int64
print(datos["famhist"].value_counts())
## Absent     270
## Present    192
## Name: famhist, dtype: int64
famhist_chd = pd.crosstab(index=datos["famhist"], columns=datos["chd"])
print(famhist_chd)
## chd       No  Si
## famhist         
## Absent   206  64
## Present   96  96
famhist_chd.index = ["Absent","Present"]
print(famhist_chd)

# Contando
## chd       No  Si
## Absent   206  64
## Present   96  96
g_chd = pd.crosstab(index=datos["chd"],columns="count") 
print(g_chd )
## col_0  count
## chd         
## No       302
## Si       160
print(g_chd['count'][0])
## 302
print(g_chd['count'][1])
## 160
g_famhist = pd.crosstab(index=datos["famhist"],columns="count") 
print(g_famhist)
## col_0    count
## famhist       
## Absent     270
## Present    192
print(g_famhist['count'][0])
## 270
print(g_famhist['count'][1])
## 192

Graficando

En este apartado se hace un recorrido sobre los datos en forma gráfica sobre la base estadística de la información contenida.

# Paso 3: Gráficos importantes
# Graficando

# Gráfico chd
alto = [g_chd['count'][0], g_chd['count'][1]]
barras = ('No', 'Sí')
y_pos = np.arange(len(barras))
null=plt.bar(y_pos, alto, color=['red','blue'])
null=plt.xticks(y_pos, barras)
plt.show()

# Gráfico famhist

alto = [g_famhist['count'][0], g_famhist['count'][1]]
barras = ('Absent ', 'Present')
y_pos = np.arange(len(barras))
null=plt.bar(y_pos, alto, color=['red','blue'])
null=plt.xticks(y_pos, barras)
plt.show()

plt.close()

# Gráfico chd
alto = [g_chd['count'][0], g_chd['count'][1]]
barras = ('No', 'Sí')
y_pos = np.arange(len(barras))
null=plt.bar(y_pos, alto, color=['red','blue'])
null=plt.xticks(y_pos, barras)
plt.show()

plt.close()

# Gráfico famhist
alto = [g_famhist['count'][0], g_famhist['count'][1]]
barras = ('Absent ', 'Present')
y_pos = np.arange(len(barras))
null=plt.bar(y_pos, alto, color=['red','blue'])
null=plt.xticks(y_pos, barras)
plt.show()

plt.close()

# Box Plots
print(datos.head())
##    sbp  tobacco   ldl  adiposity  famhist  typea  obesity  alcohol  age chd
## 0  160    12.00  5.73      23.11  Present     49    25.30    97.20   52  Si
## 1  144     0.01  4.41      28.61   Absent     55    28.87     2.06   63  Si
## 2  118     0.08  3.48      32.28  Present     52    29.14     3.81   46  No
## 3  170     7.50  6.41      38.03  Present     51    31.99    24.26   58  Si
## 4  134    13.60  3.50      27.78  Present     60    25.99    57.34   49  Si
boxplots = datos.boxplot(return_type='axes')
plt.show()

plt.close()


# Función de densidad
densidad = datos[datos.columns[:1]].plot(kind='density')
plt.show()

plt.close()

densidad = datos[datos.columns[:1]].plot(kind='density')
plt.show()

plt.close()

densidad = datos[datos.columns[8:9]].plot(kind='density')
plt.show()

plt.close()

densidad = datos['age'].plot(kind='density')
plt.show()

plt.close()

densidad = datos[datos.columns[:10]].plot(kind='density')
plt.show()

plt.close()

Histogramas.

Los siguientes gráficos muestran histogramas de los datos.

densidad = datos[datos.columns[:1]].plot(kind='hist')
plt.show()

plt.close()

densidad = datos[datos.columns[8:9]].plot(kind='hist')
plt.show()

plt.close()

densidad = datos['age'].plot(kind='hist')
plt.show()

plt.close()

densidad = datos[datos.columns[:10]].plot(kind='hist')
plt.show()

plt.close()

Test de normalidad.

Permite determinar si el conjunto de datos corresponde con una distribución normal, lo que facilitaría aplicar sobre los datos una serie de operaciones que este tipo de distribuciones permite

Test de Shapiro-Wilk

# Test de Shapiro-Wilk
shapiro_resultados = scipy.stats.shapiro(datos['age'])
print(shapiro_resultados)
## ShapiroResult(statistic=0.9370468258857727, pvalue=4.594895969788071e-13)
Test_Estadistico = shapiro_resultados[0]
print(Test_Estadistico)
## 0.9370468258857727
p_value = shapiro_resultados[1]
print(p_value)
## 4.594895969788071e-13
print(p_value < Test_Estadistico)
# Da True significa que los datos siguen la normal

# Test de Shapiro-Wilk
## True
densidad = datos['obesity'].plot(kind='density')
plt.show()

plt.close()

shapiro_resultados = scipy.stats.shapiro(datos['obesity'])
print(shapiro_resultados)
## ShapiroResult(statistic=0.96074378490448, pvalue=9.225323838180088e-10)
Test_Estadistico = shapiro_resultados[0]
print(Test_Estadistico)
## 0.96074378490448
p_value = shapiro_resultados[1]
print(p_value)
## 9.225323838180088e-10
print(p_value < Test_Estadistico)
# Da True significa que los datos siguen la normal
## True

Gráficos Scatter

# Scatter Plot entre dos variables
colores = []
for i in datos['chd']:
    if i=='Si':
        colores.append('red')
    else:
        colores.append('blue')

# Orientado a objetos
datos.plot(kind='scatter', x='age', y='obesity', c=colores)
plt.show()

plt.close()

# Estilo funcional
plt.scatter(datos['age'], datos['obesity'],c=colores)
plt.xlabel('age')
plt.ylabel('obesity')
plt.show()

plt.close()

Gráficos simultáneos de las variables en parejas.

# Gráfico de todas las variables 2 a 2
# El paquete Seaborn
import seaborn as sns

null=sns.pairplot(datos, hue='chd', height=2.5)
plt.show()

plt.close()

null=sns.pairplot(datos, hue='famhist', height=2.5)
plt.show()

plt.close()

Correlaciones

El uso de correlaciones y su visualización gráfica permite establecer el grado de “acople” entre las variables, ya que lo que se establece es la magnitud de semajanza mediante la proyección de una variable en otra. Se determina mediant el coseno del ángulo entre dos variables (lo que implica que son valores entre -1, 0 y +1). Con valor cero no hay relación, valores positivos cercanos a 1 implican mayor grado de corelación y negativos implican correlación inversa, de manera que si una variable aumenta la otra disminuye.

# Es inteligente e ingnora las variables categóricas

corr = datos.corr()
corr
##                 sbp   tobacco       ldl  ...   obesity   alcohol       age
## sbp        1.000000  0.212247  0.158296  ...  0.238067  0.140096  0.388771
## tobacco    0.212247  1.000000  0.158905  ...  0.124529  0.200813  0.450330
## ldl        0.158296  0.158905  1.000000  ...  0.330506 -0.033403  0.311799
## adiposity  0.356500  0.286640  0.440432  ...  0.716556  0.100330  0.625954
## typea     -0.057454 -0.014608  0.044048  ...  0.074006  0.039498 -0.102606
## obesity    0.238067  0.124529  0.330506  ...  1.000000  0.051620  0.291777
## alcohol    0.140096  0.200813 -0.033403  ...  0.051620  1.000000  0.101125
## age        0.388771  0.450330  0.311799  ...  0.291777  0.101125  1.000000
## 
## [8 rows x 8 columns]
f, ax = plt.subplots(figsize=(10, 8))
sns.heatmap(corr, mask=np.zeros_like(corr, dtype=np.bool), cmap=sns.diverging_palette(220, 10, as_cmap=True),
            square=True, ax=ax)

plt.show()

plt.close()


# Conviertiendo una categoría en números
print(pd.value_counts(datos["chd"]))
# Equivalente
## No    302
## Si    160
## Name: chd, dtype: int64
print(datos['chd'].value_counts())

# La siguiento función recodifica usando pandas
## No    302
## Si    160
## Name: chd, dtype: int64
def recodificar(col, nuevo_codigo):
  col_cod = pd.Series(col, copy=True)
  for llave, valor in nuevo_codigo.items():
    col_cod.replace(llave, valor, inplace=True)
  return col_cod

datos["chd"] = recodificar(datos["chd"], {'No':0,'Si':1})
datos.head()

# Luego de recoficar
##    sbp  tobacco   ldl  adiposity  famhist  typea  obesity  alcohol  age  chd
## 0  160    12.00  5.73      23.11  Present     49    25.30    97.20   52    1
## 1  144     0.01  4.41      28.61   Absent     55    28.87     2.06   63    1
## 2  118     0.08  3.48      32.28  Present     52    29.14     3.81   46    0
## 3  170     7.50  6.41      38.03  Present     51    31.99    24.26   58    1
## 4  134    13.60  3.50      27.78  Present     60    25.99    57.34   49    1
print(pd.value_counts(datos["chd"]))
# Equivalente
## 0    302
## 1    160
## Name: chd, dtype: int64
print(datos['chd'].value_counts())

# Conviertiendo un número en una categoría
## 0    302
## 1    160
## Name: chd, dtype: int64
datos["chd"] = recodificar(datos["chd"], {0:'No',1:'Si'})
datos.head()

##______________________ ACP_________________
##    sbp  tobacco   ldl  adiposity  famhist  typea  obesity  alcohol  age chd
## 0  160    12.00  5.73      23.11  Present     49    25.30    97.20   52  Si
## 1  144     0.01  4.41      28.61   Absent     55    28.87     2.06   63  Si
## 2  118     0.08  3.48      32.28  Present     52    29.14     3.81   46  No
## 3  170     7.50  6.41      38.03  Present     51    31.99    24.26   58  Si
## 4  134    13.60  3.50      27.78  Present     60    25.99    57.34   49  Si

Clasificación de información.

Son técnicas que permiten analizar datos con la intención de establecer agrupamientos de variables con patrones “de conducta” similares.

Análisis en Componentes Principales (ACP o PCA)

Para el caso de la estadística, el análisis de componentes principales (conocido en español como ACP, y en inglés como PCA) es una técnica que utiliza transformaciones lineales con el fin de poder describir un conjunto de datos con muchas variables mediante una “transformación” a un plano de dos variables nuevas. Estas variables se denominan “componentes” y deben ser idealmente no correlacionadas. Los componentes se ordenan según la “cantidad de varianza”, y por lo tanto permite reducir la dimensionalidad del data_frame (conjunto de datos) original.

Técnicamente, el ACP busca la proyección a partir de los datos originales en la cual las varaibles resultantes queden mejor representados en términos de mínimos cuadrados.

El ACP construye una transformación lineal que escoge un nuevo sistema de coordenadas para el conjunto original de datos en el cual la varianza de mayor tamaño del conjunto de datos es capturada en el primer eje (llamado el Primer Componente Principal), la segunda varianza más grande es el segundo eje, y así sucesivamente.

Procedimiento.

Para construir esta transformación lineal debe construirse primero la matriz de covarianza o matriz de coeficientes de correlación. Esta matriz es simétrica por lo que existe una base completa de vectores propios. La transformación se hace delas coordenadas originales a la nueva base mediante la transformación lineal y por lo tanto produce una reducción en la dimensión original de datos.

El ACP se emplea en el análisis exploratorio de datos, como una de las técnicas de minería para identificar agrupaciones de variables, a partir de los cuales se pueden construir modelos predictivos. En ACP se hace el cálculo y la descomposición en autovalores de la matriz de covarianza, y normalmente se hace tras centrar los datos en la media de cada atributo.

Debe diferenciarse del análisis factorial con el que tiene similitudes formales y en el cual puede ser utilizado como un método de aproximación para la extracción de factores.

Análisis de PCA en Python

En Python el análisis de componentes principales se realiza utilizando el paquete PCA dentro de la biblioteca sklearn y decomposition.

En los siguientes ejemplos se ve la aplicación de esta técnica.

Ejemplo 1
# ANÁLISIS EN COMPONENTES PRINCIPALES - ACP
# =========================================

from sklearn.decomposition import PCA

# Ejemplo 1
rng = np.random.RandomState(1)
X = np.dot(rng.rand(2, 2), rng.randn(2, 200)).T
print(X[1:20])
## [[ 0.96069503  0.5909006 ]
##  [-0.59854339 -0.40259339]
##  [-2.22805938 -0.53257674]
##  [-0.46143006 -0.49886724]
##  [-0.95892903 -0.26933102]
##  [-0.67307991 -0.33830855]
##  [ 1.30501861  0.59135785]
##  [ 0.3745456  -0.0985442 ]
##  [-1.82628627 -0.40617025]
##  [ 0.66826228  0.3368774 ]
##  [-0.58264668 -0.17736922]
##  [-0.41812898 -0.37381139]
##  [ 0.17220937  0.26466884]
##  [ 0.37711669  0.18844297]
##  [-0.67939623 -0.13160198]
##  [ 1.0314896   0.42555002]
##  [ 0.3360418   0.03909827]
##  [ 0.70574599  0.48873065]
##  [ 0.83951155  0.15212587]]
print(X.shape)
## (200, 2)
plt.scatter(X[:, 0], X[:, 1])
plt.axis('equal') # Misma Escala
## (-2.7292712056271964, 2.5702744393352615, -0.9326181575178751, 1.004413830229183)
plt.show()

plt.close()


pca = PCA(n_components=2) # Establece que va a calcular solo 2 componentes
pca.fit(X) # Ejecuta el ACP
## PCA(n_components=2)
print(pca.components_)
## [[-0.94446029 -0.32862557]
##  [-0.32862557  0.94446029]]
print(pca.explained_variance_)
## [0.7625315 0.0184779]
def dibuja_vector(v0, v1, ax=None):
    ax = ax or plt.gca()
    tipo_flecha=dict(arrowstyle='->',
                    linewidth=2,
                    shrinkA=0, shrinkB=0)
    ax.annotate('', v1, v0, arrowprops=tipo_flecha)


# Plotea los datos y las 2 componentes
plt.scatter(X[:, 0], X[:, 1], alpha=0.2)
for length, vector in zip(pca.explained_variance_, pca.components_):
    v = vector * 3 * np.sqrt(length)
    dibuja_vector(pca.mean_, pca.mean_ + v)
plt.axis('equal')
## (-2.7292712056271964, 2.5702744393352615, -0.9326181575178751, 1.004413830229183)
plt.show()

plt.close()
Ejemplo 2
from sklearn.datasets import load_digits
digits = load_digits()
digits.data.shape
## (1797, 64)
pca = PCA(2)  # Reduce las dimensiones a 2
componentes = pca.fit_transform(digits.data)
print(digits.data.shape)
## (1797, 64)
print(componentes.shape)
## (1797, 2)
plt.scatter(componentes[:, 0], componentes[:, 1],
            c=digits.target, edgecolor='none', alpha=0.5,
            cmap=plt.cm.get_cmap('nipy_spectral', 10))
plt.xlabel('componente 1')
plt.ylabel('componente 2')
plt.colorbar()
## <matplotlib.colorbar.Colorbar object at 0x135ed3340>
plt.show()

plt.close()
Ejemplo 3
print(os.getcwd())
## /Users/freddy/Documents/Cursos/UCR/IE_0217/CursoVerano/MaterialCurso/Clases/Semana07/pyClase19/pyModulo11
datos = pd.read_csv('../Datos/EjemploEstudiantes.csv',delimiter=';',decimal=",",index_col=0)

print(datos)
##         Matematicas  Ciencias  Espanol  Historia  EdFisica
## Lucia           7.0       6.5      9.2       8.6       8.0
## Pedro           7.5       9.4      7.3       7.0       7.0
## Ines            7.6       9.2      8.0       8.0       7.5
## Luis            5.0       6.5      6.5       7.0       9.0
## Andres          6.0       6.0      7.8       8.9       7.3
## Ana             7.8       9.6      7.7       8.0       6.5
## Carlos          6.3       6.4      8.2       9.0       7.2
## Jose            7.9       9.7      7.5       8.0       6.0
## Sonia           6.0       6.0      6.5       5.5       8.7
## Maria           6.8       7.2      8.7       9.0       7.0
print(datos.head())
##         Matematicas  Ciencias  Espanol  Historia  EdFisica
## Lucia           7.0       6.5      9.2       8.6       8.0
## Pedro           7.5       9.4      7.3       7.0       7.0
## Ines            7.6       9.2      8.0       8.0       7.5
## Luis            5.0       6.5      6.5       7.0       9.0
## Andres          6.0       6.0      7.8       8.9       7.3
print(datos.shape)
## (10, 5)
pca = PCA(n_components=2)
componentes = pca.fit_transform(datos)
print(componentes)
## [[-0.76471745 -1.5817637 ]
##  [ 1.66887794  1.39196556]
##  [ 1.57822841  0.29949595]
##  [-2.60701317  1.32020402]
##  [-1.43877557 -1.33566867]
##  [ 2.34790534  0.3880845 ]
##  [-0.89372557 -1.51890124]
##  [ 2.64984571  0.4254636 ]
##  [-2.62959083  2.18339513]
##  [ 0.08896518 -1.57227516]]
print(datos.shape)
## (10, 5)
print(componentes.shape)
## (10, 2)
plt.scatter(componentes[:, 0], componentes[:, 1])
plt.xlabel('componente 1')
plt.ylabel('componente 2')
plt.show()

plt.close()

Uso del paquete Prince

Ejemplo 3 de nuevo
# ACP con el paquete "prince" 
import prince

# Ejemplo anterior ahora con prince.
print(datos)
##         Matematicas  Ciencias  Espanol  Historia  EdFisica
## Lucia           7.0       6.5      9.2       8.6       8.0
## Pedro           7.5       9.4      7.3       7.0       7.0
## Ines            7.6       9.2      8.0       8.0       7.5
## Luis            5.0       6.5      6.5       7.0       9.0
## Andres          6.0       6.0      7.8       8.9       7.3
## Ana             7.8       9.6      7.7       8.0       6.5
## Carlos          6.3       6.4      8.2       9.0       7.2
## Jose            7.9       9.7      7.5       8.0       6.0
## Sonia           6.0       6.0      6.5       5.5       8.7
## Maria           6.8       7.2      8.7       9.0       7.0
print(datos.shape)
## (10, 5)
pca = prince.PCA(n_components=2,n_iter=3,rescale_with_mean=True,rescale_with_std=True,copy=True,check_input=True,engine='auto',random_state=42)
pca = pca.fit(datos)
pca.transform(datos)
##                0         1
## Lucia  -0.323063  1.772525
## Pedro  -0.665441 -1.638702
## Ines   -1.002547 -0.515692
## Luis    3.172095 -0.262782
## Andres  0.488868  1.365402
## Ana    -1.708633 -1.021700
## Carlos -0.067586  1.462336
## Jose   -2.011855 -1.275865
## Sonia   3.042030 -1.254881
## Maria  -0.923869  1.369359
ax = pca.plot_row_coordinates(datos,ax=None,figsize=(6, 6),x_component=0,y_component=1,labels=datos.index,ellipse_outline=False,ellipse_fill=False,show_points=False)
## No handles with labels found to put in legend.
plt.show()

plt.close()
Ejemplo 4 (prince)
# Ejemplo 4 (con prince)

from sklearn import datasets

X, y = datasets.load_iris(return_X_y=True)
X = pd.DataFrame(data=X, columns=['Sepal length', 'Sepal width', 'Petal length', 'Petal width'])
y = pd.Series(y).map({0: 'Setosa', 1: 'Versicolor', 2: 'Virginica'})
X.head()
##    Sepal length  Sepal width  Petal length  Petal width
## 0           5.1          3.5           1.4          0.2
## 1           4.9          3.0           1.4          0.2
## 2           4.7          3.2           1.3          0.2
## 3           4.6          3.1           1.5          0.2
## 4           5.0          3.6           1.4          0.2
pca = prince.PCA(n_components=2,n_iter=3,rescale_with_mean=True,rescale_with_std=True,copy=True,check_input=True,engine='auto',random_state=42)
pca = pca.fit(X)
pca.transform(X).head()
##           0         1
## 0 -2.264703  0.480027
## 1 -2.080961 -0.674134
## 2 -2.364229 -0.341908
## 3 -2.299384 -0.597395
## 4 -2.389842  0.646835
ax = pca.plot_row_coordinates(X,ax=None,figsize=(6, 6),x_component=0,y_component=1,labels=None,color_labels=y,ellipse_outline=False,ellipse_fill=True,show_points=True)
plt.show()

plt.close()